AWSアカウントのクリーンアップに役立つaws-nukeの紹介と注意点
「AWSアカウント内のいらないリソースを一括削除したい」
AWSアカウント内のリソースのクリーンアップしたい際に、aws-nukeが便利です。
今回は、aws-nuke
の基本的な使い方を紹介します。
便利なツールですが、設定や操作ミスで意図せずリソースを削除する可能性もあります。
安全に使うための注意点についても書いてみました。
aws-nukeとは
AWSアカウント内のリソースを削除することができるツールです。
全リソース削除以外にも、フィルター機能などを使用した特定リソースの削除や除外も可能です。
試してみる
事前準備
実行対象のAWSアカウントにアカウントエイリアスを設定する必要があります。 (実行時に、アカウントエイリアスの入力が求められます)
マネジメントコンソール>IAM>ダッシュボード>アカウントエイリアス>編集
で設定できます。
aws-nukeのインストール方法は色々ありますが、今回はDockerを使用します。 コマンドが長くなるため、ラッパースクリプトを用意すると便利です。
aws-nuke.sh
#!/bin/bash
docker run --rm -it -v $(pwd)/nuke-config.yml:/home/aws-nuke/config.yml \
-v ~/.aws:/home/aws-nuke/.aws \
rebuy/aws-nuke \
--config /home/aws-nuke/config.yml $@
aws-nuke用のconfig用意
aws-nuke.sh
と同じ階層にaws-nuke用のconfigを用意します。
(検証用の環境はAWS SSOを使用しており、IAMロール消してしまうとログインできなくなるためexcludes
で除外しています。詳細は後述)
nuke-config.yml
---
regions:
- ap-northeast-1
- global
account-blocklist:
- 000000000 # 削除対象外アカウントのアカウントID(指定しないとエラーになる)
resource-types:
# don't nuke IAM users
excludes:
- IAMRole
- IAMRolePolicyAttachment
- IAMSAMLProvider
- IAMRolePolicy
accounts:
1234567890: {} #削除対象アカウントのアカウントID 要書き換え
Dry Run
以下コマンドでDry Runが実行できます。
$./aws-nuke.sh --profile <プロファイル>
# アカウントエイリアスを聞かれるため、事前準備で設定した値を入力してエンター
Do you really want to nuke the account with the ID 1234567890 and the alias <AWSアカウントエイリアス>?
Do you want to continue? Enter account alias to continue.
> <AWSアカウントエイリアス>
削除されるリソースは以下のように表示されます。
削除不可なリソースは以下の表示になります。(KMS AWSのマネージドキー・RDSなどのデフォルトパラメータグループなど)
config修正とDry Runで結果を確認して、実行します。
実行
実際に消す場合は、オプションに--no-dry-run
を指定します。
Dry Run時と同様に、削除実施前にアカウントエイリアスの確認があります。
$./aws-nuke.sh --profile <プロファイル> --no-dry-run
CodeBuild上で実行するなど、アカウントエイリアスの確認をスキップしたい場合はオプションに--force
を指定します。
$./aws-nuke.sh --profile <プロファイル> --no-dry-run --force
特定のサービスを除外・削除
特定サービスの除外は、excludes
で指定できます。
nuke-config.yml
---
regions:
- ap-northeast-1
- global
account-blocklist:
- 000000000
resource-types:
excludes:
- SQSQueue # SQSQueue以外削除される
accounts:
1234567890: {}
削除は、targets
で指定できます。
nuke-config.yml
---
regions:
- ap-northeast-1
- global
account-blocklist:
- 000000000
resource-types:
targets:
- SQSQueue # SQSQueueのみ削除される
accounts:
1234567890: {}
特定のリソースを除外・削除
「SQSQueueは一部残して、全て消したい」ような場合はフィルターが使えます。 フィルターで指定したリソースを削除から除外することができます。
例えば、3つのSQSQueueがあるとします。
$ aws sqs list-queues
{
"QueueUrls": [
"https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-1",
"https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-2",
"https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-3"
]
}
以下のようにconfigを書くことで、test-1
とtest-2
を除外してリソース削除が可能です。
フィルターは色々な方法で指定できます。
詳細はこちらを参照ください。
nuke-config.yml
---
regions:
- ap-northeast-1
- global
account-blocklist:
- 000000000
resource-types:
excludes:
- SQSQueue # SQSQueue以外削除される
accounts:
1234567890:
filters:
SQSQueue:
- "https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-1" # リソース名を直接指定
- type: contains
value: "test-2" # test-2が含まれるもの
実行結果
ap-northeast-1 - SQSQueue - https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-1 - filtered by config
ap-northeast-1 - SQSQueue - https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-2 - filtered by config
ap-northeast-1 - SQSQueue - https://sqs.ap-northeast-1.amazonaws.com/1234567890/test-3 - would remove
Scan complete: 3 total, 1 nukeable, 2 filtered.
デフォルトではフィルターに一致するものは除外されますが、反転してフィルターに一致するものを削除することもできます。
nuke-config.yml
SQSQueue:
- type: contains
value: "test-2"
invert: true # 反転
注意点
aws-nukeは環境のクリーンアップ時に、とても便利なツールです。
一方、全てのリソースを削除することも可能なため、検証や導入には注意が必要です。
以下の対応を行うことで、使用時の安全性が増すと思います。
- Dry Runの結果を必ず確認する(特にwould remove)
- 本番環境のAWSアカウントIDを
account-blocklist
に登録しておく - 本番環境のAWSアカウント アカウントエイリアスに
prod
を含めておく- prodが含まれていると、aws-nuke実行時にエラーが出て実行されない
targets
とexcludes
の活用- まずは、
targets
指定で使ってみる - IAM系を間違って消すと、AWSアカウントに入れくなる可能性がある
- 自動でAWSアカウントセットアップしている環境など要注意(ConfigとかLambdaとか消してはいけないリソースが無いか要確認)
- まずは、
おわりに
aws-nuke
は、AWSアカウントのリソースを一気に全て消す物騒なツールという印象を持っていました。
実際に触ってみて、リソース指定や除外・豊富なフィルター機能・Dry Runなど安全にリソース削除するための仕組みがあることがわかりました。
アカウント閉鎖前や定期的にリソースをクリーンアップしたい場合などに、便利かと思うのでぜひ検討してみてください。
以上、AWS事業本部の佐藤(@chari7311)でした。